Pandas

您所在的位置:网站首页 pandas 随机选取行 Pandas

Pandas

2024-07-14 12:53| 来源: 网络整理| 查看: 265

随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。

sample() 函数的语法格式如下:

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

参数说明如下表所示:

参数名称参数说明 n 表示要抽取的行数。 frac 表示抽取的比例,比如 frac=0.5,代表抽取总体数据的50%。 replace 布尔值参数,表示是否以有放回抽样的方式进行选择,默认为 False,取出数据后不再放回。 weights 可选参数,代表每个样本的权重值,参数值是字符串或者数组。 random_state 可选参数,控制随机状态,默认为 None,表示随机数据不会重复;若为 1 表示会取得重复数据。 axis 表示在哪个方向上抽取数据(axis=1 表示列/axis=0 表示行)。

该函数返回与数据集类型相同的新对象,相当于 numpy.random.choice()。实例如下:

import pandas as pd dict = {'name':["Jack", "Tom", "Helen", "John"],'age': [28, 39, 34, 36],'score':[98,92,91,89]} info = pd.DataFrame(dict) #默认随机选择两行 print(info.sample(n=2)) #随机选择两列 print(info.sample(n=2,axis=1))

输出结果:

name age score 2 Helen 34 91 3 John 36 89 age name 0 28 Jack 1 39 Tom 2 34 Helen 3 36 John

再来看一组示例:

import pandas as pd info = pd.DataFrame({'data1': [2, 6, 8, 0], 'data2': [2, 5, 0, 8], 'data3': [12, 2, 1, 8]}, index=['John', 'Parker', 'Smith', 'William']) info #随机抽取3个数据 info['data1'].sample(n=3) #总体的50% info.sample(frac=0.5, replace=True) #data3序列为权重值,并且允许重复数据出现 info.sample(n=2, weights='data3', random_state=1)

输出结果:

随机选择3行数据: William 0 Smith 8 Parker 6 Name: data1, dtype: int64 data1 data2 data3 John 2 2 12 William 0 8 8 data1 data2 data3 John 2 2 12 William 0 8 8

数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下:

方法说明 降采样 将高频率(间隔短)数据转换为低频率(间隔长)。 升采样 将低频率数据转换为高频率。 Pandas 提供了 resample() 函数来实现数据的重采样。 降采样 通过 resample() 函数完成数据的降采样,比如按天计数的频率转换为按月计数。 import pandas as pd import numpy as np rng = pd.date_range('1/1/2021',periods=100,freq='D') ts = pd.Series(np.random.randn(len(rng)),index=rng) #降采样后并聚合 ts.resample('M').mean() 输出结果: 2021-01-31 0.210353 2021-02-28 -0.058859 2021-03-31 -0.182952 2021-04-30 0.205254 Freq: M, dtype: float64 如果您只想看到月份,那么您可以设置kind=period如下所示: ts.resample('M',kind='period').mean() 输出结果: 2021-01 -0.153121 2021-02 0.136231 2021-03 -0.238975 2021-04 -0.309502 Freq: M, dtype: float64 升采样 升采样是将低频率(时间间隔)转换为高频率,示例如下: import pandas as pd import numpy as np #生成一份时间序列数据 rng = pd.date_range('1/1/2021', periods=20, freq='3D') ts = pd.Series(np.random.randn(len(rng)), index=rng) print(ts.head()) #使用asfreq()在原数据基础上实现频率转换 ts.resample('D').asfreq().head() 输出结果: 升采样前: 2021-01-01    0.608716 2021-01-04    1.097451 2021-01-07   -1.280173 2021-01-10   -0.175065 2021-01-13    1.046831 Freq: 3D, dtype: float64 升采样后: 2021-01-01    0.608716 2021-01-02         NaN 2021-01-03         NaN 2021-01-04    1.097451 2021-01-05         NaN Freq: D, dtype: float64 频率转换 asfreq() 方法不仅能够实现频率转换,还可以保留原频率对应的数值,同时它也可以单独使用,示例如下: index = pd.date_range('1/1/2021', periods=6, freq='T') series = pd.Series([0.0, None, 2.0, 3.0,4.0,5.0], index=index) df = pd.DataFrame({'s':series}) print(df.asfreq("45s")) 输出结果: num 2021-01-01 00:00:00 0.0 2021-01-01 00:00:45 NaN 2021-01-01 00:01:30 NaN 2021-01-01 00:02:15 NaN 2021-01-01 00:03:00 3.0 2021-01-01 00:03:45 NaN 2021-01-01 00:04:30 NaN 插值处理 从上述示例不难看出,升采样的结果会产生缺失值,那么就需要对缺失值进行处理,一般有以下几种处理方式:

方法说明 pad/ffill 用前一个非缺失值去填充缺失值。 backfill/bfill 用后一个非缺失值去填充缺失值。 interpolater('linear') 线性插值方法。 fillna(value) 指定一个值去替换缺失值。 下面使用插值方法处理 NaN 值,示例如下: import pandas as pd import numpy as np #创建时间序列数据 rng = pd.date_range('1/1/2021', periods=20, freq='3D') ts = pd.Series(np.random.randn(len(rng)), index=rng) print(ts.resample('D').asfreq().head()) #使用ffill处理缺失值 ts.resample('D').asfreq().ffill().head() 输出结果: 2021-01-01 0.555580 2021-01-02 NaN 2021-01-03 NaN 2021-01-04 -0.079324 2021-01-05 NaN Freq: D, dtype: float64 #插值处理,注意对比 2021-01-01 0.555580 2021-01-02 0.555580 2021-01-03 0.555580 2021-01-04 -0.079324 2021-01-05 -0.079324 Freq: D, dtype: float64


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3